From 2b15bd651e54c86b62d0f377097c93a227794375 Mon Sep 17 00:00:00 2001 From: "cl349@freefall.cl.cam.ac.uk" Date: Fri, 1 Oct 2004 16:31:30 +0000 Subject: [PATCH] bitkeeper revision 1.1159.1.198 (415d8662Q0wZZexKh1EdIwW80jQLLg) Rearrange time init so that xtime and processed_system_time don't start out of sync. Update wall_to_monotonic when we update time from xen. --- .../arch/xen/i386/kernel/time.c | 28 ++++++++++++------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/linux-2.6.8.1-xen-sparse/arch/xen/i386/kernel/time.c b/linux-2.6.8.1-xen-sparse/arch/xen/i386/kernel/time.c index 935e7c3698..3a251b4082 100644 --- a/linux-2.6.8.1-xen-sparse/arch/xen/i386/kernel/time.c +++ b/linux-2.6.8.1-xen-sparse/arch/xen/i386/kernel/time.c @@ -363,8 +363,10 @@ EXPORT_SYMBOL(monotonic_clock); static inline void do_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) { - s64 delta; - long sec_diff; + time_t wtm_sec, sec; + s64 delta. nsec; + long sec_diff, wtm_nsec; + long wtm_nsec; __get_time_values_from_xen(); @@ -412,10 +414,17 @@ static inline void do_timer_interrupt(int irq, void *dev_id, } /* Update our unsynchronised xtime appropriately. */ - xtime.tv_sec = shadow_tv.tv_sec; - xtime.tv_nsec = shadow_tv.tv_usec * NSEC_PER_USEC; + sec = shadow_tv.tv_sec; + nsec = shadow_tv.tv_usec * NSEC_PER_USEC; + + __normalize_time(&sec, &nsec); + wtm_sec = wall_to_monotonic.tv_sec + (xtime.tv_sec - sec); + wtm_nsec = wall_to_monotonic.tv_nsec + (xtime.tv_nsec - nsec); - last_update_from_xen = xtime.tv_sec; + set_normalized_timespec(&xtime, sec, nsec); + set_normalized_timespec(&wall_to_monotonic, wtm_sec, wtm_nsec); + + last_update_from_xen = sec; } #ifdef CONFIG_XEN_PRIVILEGED_GUEST @@ -590,17 +599,16 @@ void __init time_init(void) return; } #endif - xtime.tv_sec = HYPERVISOR_shared_info->wc_sec; + __get_time_values_from_xen(); + xtime.tv_sec = shadow_tv.tv_sec; wall_to_monotonic.tv_sec = -xtime.tv_sec; - xtime.tv_nsec = HYPERVISOR_shared_info->wc_usec * NSEC_PER_USEC; + xtime.tv_nsec = shadow_tv.tv_usec * NSEC_PER_USEC; wall_to_monotonic.tv_nsec = -xtime.tv_nsec; + processed_system_time = shadow_system_time; cur_timer = select_timer(); printk(KERN_INFO "Using %s for high-res timesource\n",cur_timer->name); - __get_time_values_from_xen(); - processed_system_time = shadow_system_time; - time_irq = bind_virq_to_irq(VIRQ_TIMER); (void)setup_irq(time_irq, &irq_timer); -- 2.30.2